package modelado.soluciones;

import java.util.*;

import utiles.FactoriaDeColecciones;
import utiles.OrdenOpuestoAlNatural;
import utiles.SituacionIlegal;

import modelado.problemas.Problema;
import modelado.tipos.TipoDeOptimizacion;

public class SolucionesImpl implements Soluciones {

	private Comparator<Solucion> orden;
	private SortedSet<Solucion> soluciones;
	private Problema problema;

	public SolucionesImpl(Problema p) {
		problema = p;
		orden = null;

		TipoDeOptimizacion t = p.getTipoDeOptimizacion();
		if (t.equals(TipoDeOptimizacion.MAXIMIZAR)) {
			orden = new OrdenOpuestoAlNatural<Solucion>();
		}
		soluciones = FactoriaDeColecciones.creaSortedSet(orden);
	}

	public boolean haySolucion() {
		return !soluciones.isEmpty();
	}

	public Integer getNumSoluciones() {
		return soluciones.size();
	}

	public void addSolucion(Solucion s) {

		if (problema.esSolucion(s)) {
			Solucion s1 = s.clone();
			soluciones.add(s1);
		}
	}

	public Solucion getSolucion() {
		if (!haySolucion())
			throw new SituacionIlegal("No hay Solucion");
		return soluciones.first();
	}

	public Comparator<Solucion> getOrdenSolucion() {
		return orden;
	}

	public Set<Solucion> getSoluciones() {
		return soluciones;
	}

	public String toString() {
		String r = "El n�mero de Soluciones es = " + soluciones.size()
				+ ".  Las Soluciones son: \n";
		for (Solucion s : soluciones) {
			r = r + s + "\n";
		}
		return r;
	}

	public Set<Solucion> getMejoresSoluciones() {
		Set<Solucion> r = FactoriaDeColecciones.creaSet();
		Solucion m = getSolucion();
		for (Solucion s : getSoluciones()) {
			if (m.compareTo(s) == 0) {
				r.add(s);
			}
		}
		return r;
	}

}
